Saltar al contenido principal

4.3 Conjuntos (set)

1️⃣ ¿Qué es un conjunto?​

Un conjunto (set) en Python es una colección desordenada, mutable y que no admite elementos duplicados. Su funcionamiento es similar al de los conjuntos en matemáticas: permite realizar operaciones de unión, intersección, diferencia y comprobación de pertenencia de forma muy eficiente.

Ejemplo básico de conjnto
colores = {"rojo", "azul", "verde", "rojo"}
print(colores)

# {'rojo', 'azul', 'verde'}
en este ejemplo

Aunque se escribió "rojo" dos veces, el conjunto solo lo guarda una vez. Esto ocurre porque los conjuntos eliminan automáticamente los duplicados.


2️⃣ Características de los conjuntos​

Los conjuntos tienen varias propiedades que los diferencian de listas y tuplas:

PropiedadDescripción
DesordenadoNo conserva el orden de inserción (los elementos pueden aparecer en cualquier orden).
Sin duplicadosCada valor solo puede aparecer una vez.
MutableSe pueden añadir o eliminar elementos después de crearse.
No indexadoNo se puede acceder a los elementos por su posición (no existen índices).

Estas características hacen que los conjuntos sean ideales cuando se necesita almacenar colecciones sin repeticiones o realizar operaciones matemáticas de comparación entre grupos.


3️⃣ Cómo crear un conjunto​

🟩 Usando llaves {}​

La forma más común es escribir los elementos entre llaves y separados por comas.

Creación de un conjunto mediante ()
animales = {"perro", "gato", "loro"}
print(animales)

# {"perro", "gato", "loro"}

🟦 Con la función set()​

También se puede crear un conjunto a partir de otro tipo de colección (lista, tupla, cadena…).

letras = set("abracadabra")
print(letras)

#{'r', 'a', 'b', 'c', 'd'}
en este ejemplo

Cada letra aparece solo una vez. El conjunto elimina los duplicados automáticamente.

🟨 Conjuntos vacíos​

Para crear un conjunto vacío, no se pueden usar llaves ({}) porque Python lo interpreta como un diccionario. Debe usarse la función set().

Creación de un conjunto vacío
vacio = set()

4️⃣ Operaciones con conjuntos​

🟪 Añadir y eliminar elementos​

MétodoDescripciónEjemploResultado
add(x)Añade un elemento al conjunto.numeros.add(10)Inserta 10.
update(iterable)Añade varios elementos a la vez.numeros.update([20,30])Inserta 20 y 30.
remove(x)Elimina un elemento (error si no existe).numeros.remove(20)Borra 20.
discard(x)Elimina un elemento sin error si no existe.numeros.discard(50)No genera error.
pop()Elimina y devuelve un elemento aleatorio.elemento = numeros.pop()Quita un valor cualquiera.
clear()Vacía el conjunto.numeros.clear()Conjunto vacío {}.
distintos métodos para añadir o eliminar elementos
numeros = {1, 2, 3}
numeros.add(4)
numeros.discard(2)
print(numeros)

# {1, 3, 4} (El orden de los elmentos puede variar)

5️⃣ Operaciones matemáticas entre conjuntos​

Python permite realizar operaciones matemáticas con conjuntos de forma muy natural. Estas operaciones devuelven un nuevo conjunto con el resultado.

🟩 Unión (|)​

Une los elementos de dos conjuntos, eliminando duplicados.

A = {1, 2, 3}
B = {3, 4, 5}
print(A | B)

# {1, 2, 3, 4, 5}
union()

El método union() puede sustituir al operador '|'

🟦 Intersección (&)​

Devuelve los elementos comunes a ambos conjuntos.

print(A & B)

# {3}
intersection()

El método intersection() puede sustituir al operador '&'

🟨 Diferencia (-)​

Devuelve los elementos que están en el primero, pero no en el segundo.

print(A - B)

# {1, 2}
difference()

El método difference() puede sustituir al operador '-'

🟧 Diferencia simétrica (^)​

Devuelve los elementos que están en uno u otro, pero no en ambos.

print(A ^ B)

# {1, 2, 4, 5}
symmetric_difference()

El método symmetric_difference() puede sustituir al operador '^'


6️⃣ Comparacion entre conjuntos​

Python permite comparar conjuntos utilizando operadores relacionales, igual que en matemáticas.

OperadorSignificadoEjemploResultado
==Igualdad{1,2} == {2,1}True
!=Diferente{1,2} != {3,4}True
<Subconjunto propio{1,2} < {1,2,3}True
<=Subconjunto (incluido){1,2} <= {1,2}True
>Superconjunto propio{1,2,3} > {1,2}True
>=Superconjunto (incluido){1,2} >= {1,2}True
Ejemplo de uso de operadores relacionales
A = {1, 2, 3}
B = {2, 3}
print(B < A) # True

7️⃣ Iteración de conjuntos​

Aunque los conjuntos no tienen un orden fijo, sí se pueden recorrer con un bucle for:

Uso de for para iterar un conjunto
frutas = {"manzana", "pera", "naranja"}
for fruta in frutas:
print(fruta)
en este ejemplo

El orden puede variar en cada ejecución. Sin embargo, todos los elementos se recorren exactamente una vez.


8️⃣ Copias y conversiones​

Se pueden copiar o convertir conjuntos fácilmente.

Copia de un conjunto en otro
A = {1, 2, 3}
B = A.copy()
print(B)

También se pueden transformar en listas o tuplas:

Casting de conjuntos
lista = list(A)
tupla = tuple(A)
en este ejemplo

Estas conversiones son útiles cuando se necesita acceder a los elementos por posición o mostrarlos ordenados.


9️⃣ Conjuntos inmutables: frozenset​

Además del tipo set, Python incluye otro tipo de conjunto llamado frozenset, que es inmutable. Es decir, una vez creado, no se pueden añadir ni eliminar elementos. Sin embargo, sí permite realizar todas las operaciones matemáticas (unión, intersección, etc.) devolviendo nuevos conjuntos.

Ejemplo de Frozenset
A = frozenset({1, 2, 3})
B = frozenset({3, 4, 5})
print(A | B) # Unión
print(A & B) # Intersección

# frozenset({1, 2, 3, 4, 5})
# frozenset({3})
en este ejemplo

frozenset se comporta como un conjunto normal, pero no admite modificaciones.

utilidad de los frozenset

Los frozenset pueden ser útiles cuando queremos usar un set pero se requiere que el tipo sea inmutable. Algo no muy común, pero que podría darse, es crear un set de sets. Es decir, un ser que contiene como elementos a otros sets. El siguiente código daría un TypeError ya que los elementos de un set deben ser por definición inmutables.

s1 = {1, 2}
s2 = {3, 4}
#s3 = {s1, s2} # Error! TypeError

Para resolver este problema, podemos crear un set de frozensets. Esto si es posible ya que el frozenset es un tipo inmutable.

s1 = frozenset([1, 2])
s2 = frozenset([3, 4])
s3 = {s1, s2}
print(s3) #{frozenset({3, 4}), frozenset({1, 2})}

Otra de sus principales ventajas es que puede usarse como clave en un diccionario o como elemento de otro conjunto, ya que es inmutable.


📊 Tabla resumen​

Característicasetfrozenset
Ordenado❌ No❌ No
Duplicados❌ No❌ No
Mutable✅ Sí❌ No
Indexado❌ No❌ No
Permite operaciones matemáticas✅ Sí✅ Sí
Métodos principalesadd, remove, discard, union, intersection, difference, clear, copyIgual, excepto los que modifican
Uso típicoColecciones dinámicas sin repeticionesConjuntos fijos o como claves en diccionarios